package com.bit.cfdi.web.domain;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "persona")
public class Persona implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6750218273258351185L;
	
	//Constants
	public static final String NOMBRE = "nombre";
	public static final String APELLIDO_P = "apellido_p";
	public static final String APELLIDO_M = "apellido_m";
	public static final String FEMALE = "Mujer";
	public static final String MALE = "Hombre";
	
	// Fields
	private Long idPersona;
	private Contacto contacto;
	private Direccion direccion;
	private String nombre;
	private String apellidoPaterno;
	private String apellidoMaterno;
	private Calendar fechaNacimiento;
	private String sexo;
	private Long ultimaModificacionPor;
	private Calendar fechaModificacion;
	private Set<Usuario> usuarios = new HashSet<Usuario>(0);
	private Set<Imagen> imagenes = new HashSet<Imagen>(0);

	// Property accessors
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id_persona", nullable = false)
	public Long getIdPersona() {
		return this.idPersona;
	}

	public void setIdPersona(final Long idPersona) {
		this.idPersona = idPersona;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_contacto")
	public Contacto getContacto() {
		return this.contacto;
	}

	public void setContacto(final Contacto contacto) {
		this.contacto = contacto;
	}

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_direccion")
	public Direccion getDireccion() {
		return this.direccion;
	}

	public void setDireccion(final Direccion direccion) {
		this.direccion = direccion;
	}

	@Column(name = "nombre", length = 100)
	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(final String nombre) {
		this.nombre = nombre;
	}

	@Column(name = "apellido_paterno", length = 100)
	public String getApellidoPaterno() {
		return this.apellidoPaterno;
	}

	public void setApellidoPaterno(final String apellidoPaterno) {
		this.apellidoPaterno = apellidoPaterno;
	}

	@Column(name = "apellido_materno", length = 100)
	public String getApellidoMaterno() {
		return this.apellidoMaterno;
	}

	public void setApellidoMaterno(final String apellidoMaterno) {
		this.apellidoMaterno = apellidoMaterno;
	}

	@Column(name = "fecha_nacimiento")
	@Temporal(TemporalType.TIMESTAMP)
	public Calendar getFechaNacimiento() {
		return this.fechaNacimiento;
	}

	public void setFechaNacimiento(final Calendar fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	@Column(name = "sexo", length = 10)
	public String getSexo() {
		return this.sexo;
	}

	public void setSexo(final String sexo) {
		this.sexo = sexo;
	}

	@Column(name = "ultima_modificacion_por")
	public Long getUltimaModificacionPor() {
		return this.ultimaModificacionPor;
	}

	public void setUltimaModificacionPor(final Long ultimaModificacionPor) {
		this.ultimaModificacionPor = ultimaModificacionPor;
	}

	@Column(name = "fecha_modificacion")
	@Temporal(TemporalType.TIMESTAMP)
	@Version
	public Calendar getFechaModificacion() {
		return this.fechaModificacion;
	}

	public void setFechaModificacion(final Calendar fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "persona")
	public Set<Usuario> getUsuarios() {
		return this.usuarios;
	}

	public void setUsuarios(final Set<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "persona")
	public Set<Imagen> getImagenes() {
		return this.imagenes;
	}

	public void setImagenes(final Set<Imagen> imagenes) {
		this.imagenes = imagenes;
	}

}